# 协程是一种比线程更加轻量级的并发编程方式，它允许在程序执行过程中暂停和恢复，从而实现高效的异步操作。
# asyncio 是 Python 标准库中用于编写异步代码的库，它提供了事件循环、协程、任务等机制，用于管理和调度异步操作。
# aiohttp 是一个基于 asyncio 的异步 HTTP 客户端 / 服务器库，可用于发起异步 HTTP 请求。

# 可实现高效的并发操作
import asyncio
# 进行异步网络请求
import aiohttp

# 定义一个异步函数 fetch，用于从指定的 URL 获取网页内容
async def fetch(session, url):
    # 使用 async with 语句创建一个异步上下文管理器，发起一个 GET 请求
    async with session.get(url) as response:
        # 等待响应的内容，并以文本形式返回
        return await response.text()

# 定义主异步函数 main，它是程序的入口点
async def main():
    # 定义一个包含多个 URL 的列表，这些 URL 是要请求的目标网站
    urls = [
        'http://example.com',
        'http://example.org',
        'http://example.net'
    ]
    # 使用 async with 语句创建一个异步的 HTTP 会话对象
    async with aiohttp.ClientSession() as session:
        # 创建一个空列表 tasks，用于存储所有的异步任务
        tasks = []
        # 遍历 urls 列表中的每个 URL
        for url in urls:
            # 使用 asyncio.create_task 函数创建一个异步任务，任务的目标是调用 fetch 函数
            task = asyncio.create_task(fetch(session, url))
            # 将创建的任务添加到 tasks 列表中
            tasks.append(task)
        # 使用 asyncio.gather 函数并发地运行所有任务，并等待它们全部完成
        # *tasks 是将 tasks 列表解包为多个独立的参数传递给 asyncio.gather 函数
        results = await asyncio.gather(*tasks)
        # 遍历所有任务的结果
        for result in results:
            # 打印每个结果的前 100 个字符
            print(result[:100])

if __name__ == "__main__":
    # 使用 asyncio.run 函数来运行主异步函数 main，启动整个异步程序
    asyncio.run(main())